package com.example.kotlinstudy.s4

import org.junit.Test
import kotlin.math.roundToInt

class ExampleUnitTest4 {
    /*
    * kotlin在编译时就在检测 ，空类型的
    * */

    @Test         //null  空类型
    fun test1() {
        var str: String? = "butterfly"
//        str = null  //定义的时候加了？  这里就可以赋为null

        //安全调用操作符?，如果上面加了问号，这里也要加？否则不能能过
//        println(str?.capitalize())//把首字母变成大写


        str = str?.let {
            if (it.isNotBlank()) {
                it.capitalize()
            } else
                "butterfly"
        }
        println(str)
    }

    @Test//!!非空断言操作符
    fun test2() {
        var str: String? = "butterfly"
        str = null
//        println(str!!.capitalize())  //这样是空的情况下也可以调用，会抛出KotlinNullPointerException异常

        //还可以像java中一样判断
        if (str != null) {
            str = str.capitalize()
        } else println("str 为空 ")

        //我们可以能过安全操作符进行链式调用
        str = str?.capitalize().plus(" is great")
        println(str)

        str = null
        //空合并操作符 ?:
        println(str ?: "jack")  //代替了if ..else

        str = "jack"
        str = str?.let { it.capitalize() } ?: "butterfly"
        println(str)
    }

    @Test//异常
    fun test3() {
        var number: Int? = null
        try {
            checkOperation(number)
            number!!.plus(1)
        } catch (e: Exception) {
            println(e)
        }

    }

    fun checkOperation(number: Int?) {
//        number?:throw UnskilledException()//自定义异常
        checkNotNull(number, { "Something is not good" })  //先决条件函数  Kotlin 自带的
    }

    @Test//字符串的操作
    fun test4() {
        val index = NAME.indexOf('\'')
        println(index)
//        var str = NAME.substring(0, index)  //java中
        var str = NAME.substring(0 until index) //kotlin中
        println(str)

//        val data: List<String> = NAMES.split(",")
//        data[0]

        val (origin, dest, proxy) = NAMES.split(",")  //解构语法特性，同时多个变量
        println("$origin,$dest,$proxy")


        //replace 替换比java更加强大
        val str1 = "The people's Republic of China."
        val str2 = str1.replace(Regex("[aeiou]")) {
            when (it.value) {//直接进行加密
                "a" -> "8"
                "e" -> "6"
                "i" -> "9"
                "o" -> "1"
                "u" -> "3"
                else -> it.value
            }
        }
        println(str2)

        //字符串比较
        // ==检查两个字符串的字符是否匹配 ， ===检查两个变量是否指向内存堆上同一对象
        // 而java ==做引用比较，equals做内容比较
        val str00 = "Jason"
//        val str11 = "Jason"
        val str11 = "jason".capitalize() //这样写===就返回false ,在内存中会多出一个，所以地址也不一样
        println(str00 == str11) //比较内容 true
        println(str00 === str11) //比较引用 true(因为java常量池的原因)

        //字符串遍历
        "The people's Republic of China.".forEach {
            println("$it*")
        }
    }

    @Test //数字类型
    fun test5() {
        //Kotlin 中提供了一些安全转换方法
//        val number: Int = "8.98".toInt()
        val number: Int? = "8.98".toIntOrNull() // 必须要安全符  ?可空类型
        println(number)

        println(8.98564.toInt())
        println(8.98564.roundToInt())//四舍五入
        val s = "%.2f".format(8.95846)//保留小数点
        println(s)
    }
}

const val NAME = "Jimmy's friend"
const val NAMES = "jack,jacks,jason"

//自定义异常
class UnskilledException() : IllegalAccessException("操作不当") {


}